package org.edu.modules.oa.controller;



import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectResult;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import groovy.util.logging.Slf4j;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.formula.functions.T;
import org.apache.shiro.SecurityUtils;
import org.edu.common.api.vo.Result;
import org.edu.common.aspect.annotation.AutoLog;
import org.edu.common.system.vo.LoginUser;
import org.edu.common.util.RedisUtil;
import org.edu.modules.oa.config.QueryConditionTool;
import org.edu.modules.oa.entity.SysDictItemEntity;
import org.edu.modules.oa.entity.VeFileFilesEntity;
import org.edu.modules.oa.entity.VeOaCarInfoEntity;
import org.edu.modules.oa.entity.VeOaCarJiayouEntity;
import org.edu.modules.oa.mapper.ISysDictItemMapper;
import org.edu.modules.oa.mapper.IVeFileFilesMapper;
import org.edu.modules.oa.service.IVeOaCarInfoService;
import org.edu.modules.oa.service.IVeOaCarJiayouService;
import org.edu.modules.oa.util.OssDownloadUtil;
import org.edu.modules.oa.vo.*;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@Api(tags="车辆信息管理")
@RestController
@RequestMapping("oa/veOaInfo")
@Slf4j
@ApiSort(value = 100)

public class VeOaInfoController {

    @Resource()
    private IVeOaCarInfoService iVeOaCarInfoService;// 车辆信息业务类
    @Resource
    private OSS ossClient;
    @Autowired
    private RedisUtil redisUtil; // redis服务类
    @Resource private  ISysDictItemMapper iSysDictItemMapper;

@AutoLog(value = "车辆信息管理-显示表格")

    @ApiOperation(value="显示表格", notes="车辆信息管理-显示表格")

    @PostMapping(value = "/showTable")

    public Result<?> showTable(VeOaCarInfoEntity veOaCarInfoEntity, Integer startPage, Integer pageSize) {
        HashMap<String, Object> map=iVeOaCarInfoService.showTable(veOaCarInfoEntity,startPage,pageSize);
    // 获取redis存的用户值

    LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();

    map.put("userName",user.getRealname());
        return Result.OK(map);
    }
    @AutoLog(value = "车辆信息管理-单个删除")
    @ApiOperation(value="单个删除", notes="车辆信息管理-单个删除")
    @PostMapping(value = "/oneDelete")

    public Result<?> oneDelete(Integer id) {
        Integer result=iVeOaCarInfoService.deleteRecord(id);
        return Result.OK();
    }
    @AutoLog(value = "车辆信息管理-批量删除")
    @ApiOperation(value="批量删除", notes="车辆信息管理-批量删除")
    @PostMapping(value = "/allDelete")

    public Result<?> allDelete(String idStr) {
        Integer result=0;
      String data[] = idStr.split(",");

      for (int i=1;i<data.length;i++){

          result+=iVeOaCarInfoService.deleteRecord(Integer.valueOf(data[i]));

      }
        return Result.OK();
    }
    //导出
    @AutoLog(value = "车辆信息管理-导出excel表格")
    @ApiOperation(value = "导出excel表格", notes = "车辆信息管理—导出excel表格")
    @GetMapping(value = "/exportTable")
    // ModelAndView 导出表格流
    public ModelAndView exportTable() {
    // 创建导出流
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 查数据获得加油表格的集合
        List<VeOaCarInfoExportVo> list = iVeOaCarInfoService.xporte();
        // 文件的文件名
        mv.addObject(NormalExcelConstants.FILE_NAME, "车辆信息");
        // 数据的类型
        mv.addObject(NormalExcelConstants.CLASS, VeOaCarInfoExportVo.class);
        // 获取redis存的用户值

        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        // ExportParams  Export工具类   （参数1--》title:表格标题  参数2--》secomdTitle:第二行的标题，  参数3--》secomdTitle:最下面尾部的信息）
        ExportParams exportParams = new ExportParams("车辆信息", "导出人:" + user.getRealname(), "导出车辆信息");
        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
        mv.addObject(NormalExcelConstants.DATA_LIST, list);
        return mv;
    }
    //导入
    @AutoLog(value = "车辆信息管理-导入excel表格")
    @ApiOperation(value = "导入excel表格", notes = "车辆信息管理—导入excel表格")
    @PostMapping(value = "jiayouUploading")
    public Result<?> excelImport(HttpServletRequest req, HttpServletResponse resp) {
        // 获取文件
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) req;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            MultipartFile file = entity.getValue();// 获取上传文件对象
            ImportParams params = new ImportParams();
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setNeedSave(true);
            try {
                // 把excel表格的数据存在集合里面去
                List<VeOaCarInfoExportVo> list = ExcelImportUtil.importExcel(file.getInputStream(), VeOaCarInfoExportVo.class, params);
                // 获取redis存的用户值
                LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();

                // 插入数据的集合
                List<VeOaCarInfoEntity> entityList =new ArrayList<>();
                int count =list.size();
                for (VeOaCarInfoExportVo vo:list){
                    if(vo.getCarName()==null||vo.getCarName().equals("")){
                        count--;
                        continue;
                    }
                    // 重复校验
                    VeOaCarInfoEntity  entitya =iVeOaCarInfoService.duplicationCheck(vo.getCarName(),vo.getCarPaihao());


                    if(entitya!=null){

                        return  Result.error(500,"车辆名添加的时候不能重复");

                    }
                    System.out.println(vo);
                    VeOaCarInfoEntity infoEntity =new VeOaCarInfoEntity();
                    QueryWrapper<SysDictItemEntity> wrapper =new QueryWrapper();
                     wrapper.eq("item_text",vo.getLeixing());
                    wrapper.eq("dict_id","1386861063413415938");
                    SysDictItemEntity leixing=iSysDictItemMapper.selectOne(wrapper);
                    QueryWrapper<SysDictItemEntity> wrapperTwo =new QueryWrapper();
                    wrapperTwo.eq("item_text",vo.getNowStatus());
                    wrapperTwo.eq("dict_id","1386863928907382786");

                    SysDictItemEntity state=iSysDictItemMapper.selectOne(wrapperTwo);
                    System.out.println(state);
                    System.out.println(leixing);

                    if(state!=null||leixing!=null){


                    }else{
                        return  Result.error(500,"类型或者状态输入错误");

                    }
                    infoEntity.setCarName(vo.getCarName());
                    infoEntity.setCarPaihao(vo.getCarPaihao());
                    infoEntity.setCarXinghao(vo.getCarXinghao());
                    infoEntity.setLeixing(leixing.getId());
                    infoEntity.setSuoshuDep(vo.getSuoshuDep());
                    infoEntity.setDriverUser(vo.getDriverUser());
                    infoEntity.setNowStatus(state.getId());
                    infoEntity.setFileId(null);

                    infoEntity.setBackInfo(vo.getBackInfo());
                    infoEntity.setTixingContent(vo.getTixingContent());
                    // 字符串转换成时间类型
                    SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date=formatter.parse(vo.getTixingDate());
                    infoEntity.setTixingDate(date);
                    infoEntity.setTixingUser(vo.getTixingUser());
                    infoEntity.setCreateBy(user.getId());
                    infoEntity.setUpdateBy(user.getId());
                    infoEntity.setTerminalId(1);
                    infoEntity.setCreateByName(user.getRealname());
                    infoEntity.setUpdateByName(user.getRealname());



                    entityList.add(infoEntity);
                }
                //update-begin-author:taoyan date:20190528 for:批量插入数据
                long start = System.currentTimeMillis();
                iVeOaCarInfoService.saveBatch(entityList);
                //400条 saveBatch消耗时间1592毫秒  循环插入消耗时间1947毫秒
                //1200条  saveBatch消耗时间3687毫秒 循环插入消耗时间5212毫秒
//                log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
                //update-end-author:taoyan date:20190528 for:批量插入数据
                return Result.ok("文件导入成功！数据行数：" + count);
            } catch (Exception e) {
                e.printStackTrace();
//                log.error(e.getMessage(), e);
//                return Result.error("文件导入失败:" + e.getMessage());
            } finally {
                try {
                    file.getInputStream().close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return Result.error("文件导入失败！");
//        return super.importExcel(req, resp, VeOaCarJiayouEntity.class);
    }

    //导出excel模板
    @AutoLog(value = "车辆信息管理-导出excel模板")
    @ApiOperation(value = "导出excel模板", notes = "车辆加油—导出excel模板")
    @GetMapping(value = "exportModel")
    public ModelAndView exportModel() {
        // 创建导出流

        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 文件的文件名

        mv.addObject(NormalExcelConstants.FILE_NAME, "车辆加油记录");
        mv.addObject(NormalExcelConstants.CLASS, VeOaCarJiayouExportVo.class);
        // 获取redis存的用户值

        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        // ExportParams  Export工具类   （参数1--》title:表格标题  参数2--》secomdTitle:第二行的标题，  参数3--》secomdTitle:最下面尾部的信息）

        ExportParams exportParams = new ExportParams("车辆加油记录", "导出人:" + user.getRealname(), "导出车辆加油记录");

        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
        mv.addObject(NormalExcelConstants.DATA_LIST, new ArrayList<VeOaCarJiayouExportVo>());
        return mv;
    }
    // 详情展示
    @AutoLog(value = "车辆信息管理-详情展示")
    @ApiOperation(value="详情展示", notes="车辆信息管理-详情展示")
    @PostMapping(value = "/viewDetails")
    public Result viewDetails(Integer id) {
        VeOaCarInfoShowVo veOaCarInfoShowVo= iVeOaCarInfoService.viewDetails(id);
        return Result.OK(veOaCarInfoShowVo);
    }

    // 修改车辆信息
    @AutoLog(value = "车辆信息管理-修改车辆信息")
    @ApiOperation(value="修改车辆信息", notes="车辆信息管理-修改车辆信息")
    @PostMapping(value = "/amendCar")
    public Result amendCar(MultipartFile file,VeOaCarInfoEntity veOaCarInfoEntity,String tixingDateStr,Integer state) throws Exception {
    if(state!=1){
        // 重复校验
        VeOaCarInfoEntity  entitya =iVeOaCarInfoService.duplicationCheck(veOaCarInfoEntity.getCarName(),veOaCarInfoEntity.getCarPaihao());


        if(entitya!=null){

            return  Result.error(500,"车辆名修改的时候不能重复");

        }
    }

        //创建文件类
        VeFileFilesEntity veFileFilesEntity = null;
        String fileName = null;
        String suffixName = null;
        if(file != null){
            //myFile为MultipartFile类型
//            CommonsMultipartFile cf= (CommonsMultipartFile)file;
//            DiskFileItem fi = (DiskFileItem)cf.getFileItem();
//            File document = fi.getStoreLocation();
            //把MultipartFile文件流转换成文件
            File document = null;
            //获取文件名
            fileName = file.getOriginalFilename();
            //用点来切割获取文件类型注意//.需要加双斜杠正则表达式
            String[] arr = fileName.split("\\.");
            //获取文件后缀名
            suffixName = arr[arr.length-1];
            if(suffixName.equals("java") || suffixName.equals("class")){
                return Result.error(400,"文件类型不能上传");
            }
            try {
                String originalFilename = file.getOriginalFilename();
                String[] filename = originalFilename.split("\\.");
                document=File.createTempFile(filename[0], filename[1]);
                file.transferTo(document);
                document.deleteOnExit();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //获取文件长度
            Long size = file.getSize();
            //获取唯一的文件名称
            String docName = UUID.randomUUID().toString();
            //上传文件到指定的存储空间  第一个参数 bucketName  第二个参数 OSS存储路径  第三个参数 要上传的文件
//            PutObjectResult result = ossClient.putObject("digital-school-xx0422","school-demo/"+docName,document);
            PutObjectResult result = ossClient.putObject("exaplebucket-beijing", docName+"/"+fileName, document);
            //文件下载地址
            String path = "https://digital-school-xx0422.oss-cn-shenzhen.aliyuncs.com/school-demo/"+docName;
            veFileFilesEntity = new VeFileFilesEntity();
            //当前插入的时间
            Long time = System.currentTimeMillis()/1000;
            veFileFilesEntity.setSourceFile("https://exaplebucket-beijing.oss-cn-beijing.aliyuncs.com/"+docName+"/"+fileName);
            veFileFilesEntity.setName(fileName);
            veFileFilesEntity.setExt(suffixName);
            veFileFilesEntity.setCreateTime(time);
            veFileFilesEntity.setSize(size);
        }

        // 获取redis存的用户值
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();


        // 前端传过来的时间字符串转换成日期
//        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //        Date dateTixing=formatter.parse(tixingDateStr.trim());
//        ---------------------------------修改时间格式转换方法(lbh)
        SimpleDateFormat formatter=new SimpleDateFormat("EEE MMM dd yyyy hh:mm:ss z", Locale.ENGLISH);
        String tixingDate = tixingDateStr.replace("GMT", "").replaceAll("\\(.*\\)", "");
        Date dateTixing=formatter.parse(tixingDate.trim());
//        -------------------------------

        veOaCarInfoEntity.setTixingDate(dateTixing);

        veOaCarInfoEntity.setCreateBy(user.getId());
        veOaCarInfoEntity.setUpdateBy(user.getId());
        veOaCarInfoEntity.setTerminalId(1);
        veOaCarInfoEntity.setCreateByName(user.getRealname());
        veOaCarInfoEntity.setUpdateByName(user.getRealname());


        Integer result= null;
        try {
            result = iVeOaCarInfoService.amendCarInfo(veOaCarInfoEntity,veFileFilesEntity);
        } catch (Exception e) {
            return Result.error(500,"表格数据有问题不能上传");
        }
        return Result.OK(result);
    }

    // 增加车辆信息
    @AutoLog(value = "车辆信息管理-增加车辆信息")
    @ApiOperation(value="增加车辆信息", notes="车辆信息管理-增加车辆信息")
    @PostMapping(value = "/addCar")
    public Result addCar(MultipartFile file,VeOaCarInfoEntity veOaCarInfoEntity,String tixingDateStr) throws Exception {
        System.out.println(veOaCarInfoEntity);
        System.out.println(tixingDateStr);

        //创建文件类
        VeFileFilesEntity veFileFilesEntity = null;
        String fileName = null;
        String suffixName = null;
        if(file != null){
            //myFile为MultipartFile类型
//            CommonsMultipartFile cf= (CommonsMultipartFile)file;
//            DiskFileItem fi = (DiskFileItem)cf.getFileItem();
//            File document = fi.getStoreLocation();
            //把MultipartFile文件流转换成文件
            File document = null;
            //获取文件名
            fileName = file.getOriginalFilename();
            //用点来切割获取文件类型注意//.需要加双斜杠正则表达式
            String[] arr = fileName.split("\\.");
            //获取文件后缀名
            suffixName = arr[arr.length-1];
            if(suffixName.equals("java") || suffixName.equals("class")){
                return Result.error(400,"文件类型不能上传");
            }
            try {
                String originalFilename = file.getOriginalFilename();
                String[] filename = originalFilename.split("\\.");
                document=File.createTempFile(filename[0], filename[1]);
                file.transferTo(document);
                document.deleteOnExit();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //获取文件长度
            Long size = file.getSize();
            //获取唯一的文件名称
            String docName = UUID.randomUUID().toString();
            //上传文件到指定的存储空间  第一个参数 bucketName  第二个参数 OSS存储路径  第三个参数 要上传的文件
//            PutObjectResult result = ossClient.putObject("digital-school-xx0422","school-demo/"+docName,document);
//            PutObjectResult result = ossClient.putObject("digital-school-xx0422","school-demo/"+fileName,document);
            PutObjectResult result = ossClient.putObject("exaplebucket-beijing", docName+"/"+fileName, document);
            //文件下载地址
//            String path = "https://digital-school-xx0422.oss-cn-shenzhen.aliyuncs.com/school-demo/"+docName;
            String path = "https://digital-school-xx0422.oss-cn-shenzhen.aliyuncs.com/school-demo/"+docName+"/"+fileName;
            veFileFilesEntity = new VeFileFilesEntity();
            //当前插入的时间
            Long time = System.currentTimeMillis()/1000;
            veFileFilesEntity.setSourceFile("https://exaplebucket-beijing.oss-cn-beijing.aliyuncs.com/"+docName+"/"+fileName);
            veFileFilesEntity.setName(fileName);
            veFileFilesEntity.setExt(suffixName);
            veFileFilesEntity.setCreateTime(time);
            veFileFilesEntity.setSize(size);
        }
        // 获取redis存的用户值
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();

        System.out.println("veOaCarInfoEntity.getCarName()"+veOaCarInfoEntity.getCarName());

        // 重复校验
        VeOaCarInfoEntity  entitya =iVeOaCarInfoService.duplicationCheck(veOaCarInfoEntity.getCarName(),veOaCarInfoEntity.getCarPaihao());


        if(entitya!=null){

            return  Result.error(500,"车辆名添加的时候不能重复");

        }
        // 前端传过来的时间字符串转换成日期
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dateTixing=formatter.parse(tixingDateStr.trim());
        veOaCarInfoEntity.setTixingDate(dateTixing);

        veOaCarInfoEntity.setCreateBy(user.getId());
        veOaCarInfoEntity.setUpdateBy(user.getId());
        veOaCarInfoEntity.setTerminalId(1);
        veOaCarInfoEntity.setCreateByName(user.getRealname());
        veOaCarInfoEntity.setUpdateByName(user.getRealname());

        Integer result= iVeOaCarInfoService.addCarInfo(veOaCarInfoEntity,veFileFilesEntity);
        return Result.OK(result);
    }
    // 高级搜索
    @AutoLog(value = "车辆信息管理-高级搜索")
    @ApiOperation(value="高级搜索", notes="车辆信息管理-高级搜索")
    @PostMapping(value = "/advancedQuery")

    public Result advancedQuery(@RequestBody String queryArray) {
        Map<String, List<QueryCondition>> maps = (Map<String, List<QueryCondition>>) JSON.parse(queryArray);
        List<QueryCondition> list=new ArrayList<QueryCondition>(JSONArray.parseArray(maps.get("queryArray").toString(),QueryCondition.class));
        System.out.println("==========================================");


        System.out.println(list);
        String  conditionStr =  QueryConditionTool.getQueryConditionTool().advancedQuery(list);

        HashMap<String , Object>  map=null;
        try {
            map= iVeOaCarInfoService.advancedQuery(conditionStr);
        } catch (Exception e) {

            // 查询表格总行数
            return Result.error("s");
        }
        return  Result.OK(map);
    }

    // 加载教职工下拉框 和 编制类别下拉框
    // 日志注解
    @AutoLog(value = "车辆信息管理-加载下拉框")
    @ApiOperation(value="会议发起申请", notes="车辆信息管理-加载下拉框")
    // 会议发起申请
    @PostMapping(value = "/loadBox")

    public Result<?> loadBox()  {

        HashMap<String ,Object> map=  iVeOaCarInfoService.loadBox();

        return  Result.OK(map);
    }
    // 加载教职工下拉框 和 编制类别下拉框
    // 日志注解
    @AutoLog(value = "车辆信息管理-保存对象到缓存")
    @ApiOperation(value="保存对象到缓存", notes="车辆信息管理-保存对象到缓存")
    // 会议发起申请
    @PostMapping(value = "/saveCarInfo")

    public Result<?> saveCarInfo(VeOaCarInfoTableVo carInfo)  {
        // 保存对象到redis数据库里面
        redisUtil.set("carInfo",carInfo);




        return  Result.OK();
    }
    //获取模板下载地址
    @AutoLog(value = "车辆信息管理-模板地址获取")
    @ApiOperation(value = "模板地址", notes = "车辆信息管理-模板地址获取")
    @PostMapping(value = "/getUrl")
    public Result<T> getUrl() throws Exception {
        Result result = new Result();
        String url= OssDownloadUtil.getOssDownloadUtil().downFileFromOSS("车辆信息模板.xls");
        result.success(url);
        return result;
    }


}
